package com.java.jvm.loader;
class ClassA{
    static int a=10;
    static{
        System.out.println("ClassA.static{}");
    }
}
class ClassB{
    static int b=10;
    static{
        System.out.println("ClassB.static{}");
    }
}
class ClassC{
    static int c=10;
    static{
        System.out.println("ClassC.static{}");
    }
}
//跟踪类的加载可以使用JVM参数：-XX:+TraceClassLoading
public class ClassLoaderTraceTests {
    public static void main(String[] args) throws ClassNotFoundException, InterruptedException {
       //1.隐式加载?
       // ClassA a1;//这种情况不会加载ClassA
       // int a2=ClassA.a;//此时会加载ClassA
          new ClassA();//假如ClassA已经被加载，则此时会使用内存中ClassA，不再进行加载
       //2.显示加载？（直接使用指定类加载器去加载）
        ClassLoader.getSystemClassLoader()//获取类加载器
                .loadClass("com.java.jvm.loader.ClassB");//类会被加载但不会执行静态代码块

        //Class.forName("com.java.jvm.loader.ClassC");//会加载类并执行静态代码块

        Class.forName("com.java.jvm.loader.ClassC",
                false,//false表示只加载类，但是不会执行初始化
                ClassLoader.getSystemClassLoader());
       //思考：类加载时一定会执行静态代码块？不一定
    }
}
